#include "core.hpp"

#define JN_MAP(f, ...) BOOST_PP_CAT(JN_MAP_, PP_VARIADIC_SIZE(__VA_ARGS__))(f, __VA_ARGS__)
#define JN_MAP_1(f ,p1) f (p1)
#define JN_MAP_2(f ,p1 ,p2) f (p1) f (p2)
#define JN_MAP_3(f ,p1 ,p2 ,p3) f (p1) f (p2) f (p3)
#define JN_MAP_4(f ,p1 ,p2 ,p3 ,p4) f (p1) f (p2) f (p3) f (p4)
#define JN_MAP_5(f ,p1 ,p2 ,p3 ,p4 ,p5) f (p1) f (p2) f (p3) f (p4) f (p5)
#define JN_MAP_6(f ,p1 ,p2 ,p3 ,p4 ,p5 ,p6) f (p1) f (p2) f (p3) f (p4) f (p5) f (p6)
#define JN_MAP_7(f ,p1 ,p2 ,p3 ,p4 ,p5 ,p6 ,p7) f (p1) f (p2) f (p3) f (p4) f (p5) f (p6) f (p7)
#define JN_MAP_8(f ,p1 ,p2 ,p3 ,p4 ,p5 ,p6 ,p7 ,p8) f (p1) f (p2) f (p3) f (p4) f (p5) f (p6) f (p7) f (p8)
#define JN_MAP_9(f ,p1 ,p2 ,p3 ,p4 ,p5 ,p6 ,p7 ,p8 ,p9) f (p1) f (p2) f (p3) f (p4) f (p5) f (p6) f (p7) f (p8) f (p9)
#define JN_MAP_10(f ,p1 ,p2 ,p3 ,p4 ,p5 ,p6 ,p7 ,p8 ,p9 ,p10) f (p1) f (p2) f (p3) f (p4) f (p5) f (p6) f (p7) f (p8) f (p9) f (p10)
#define JN_MAP_11(f ,p1 ,p2 ,p3 ,p4 ,p5 ,p6 ,p7 ,p8 ,p9 ,p10 ,p11) f (p1) f (p2) f (p3) f (p4) f (p5) f (p6) f (p7) f (p8) f (p9) f (p10) f (p11)
#define JN_MAP_12(f ,p1 ,p2 ,p3 ,p4 ,p5 ,p6 ,p7 ,p8 ,p9 ,p10 ,p11 ,p12) f (p1) f (p2) f (p3) f (p4) f (p5) f (p6) f (p7) f (p8) f (p9) f (p10) f (p11) f (p12)
#define JN_MAP_13(f ,p1 ,p2 ,p3 ,p4 ,p5 ,p6 ,p7 ,p8 ,p9 ,p10 ,p11 ,p12 ,p13) f (p1) f (p2) f (p3) f (p4) f (p5) f (p6) f (p7) f (p8) f (p9) f (p10) f (p11) f (p12) f (p13)
#define JN_MAP_14(f ,p1 ,p2 ,p3 ,p4 ,p5 ,p6 ,p7 ,p8 ,p9 ,p10 ,p11 ,p12 ,p13 ,p14) f (p1) f (p2) f (p3) f (p4) f (p5) f (p6) f (p7) f (p8) f (p9) f (p10) f (p11) f (p12) f (p13) f (p14)
#define JN_MAP_15(f ,p1 ,p2 ,p3 ,p4 ,p5 ,p6 ,p7 ,p8 ,p9 ,p10 ,p11 ,p12 ,p13 ,p14 ,p15) f (p1) f (p2) f (p3) f (p4) f (p5) f (p6) f (p7) f (p8) f (p9) f (p10) f (p11) f (p12) f (p13) f (p14) f (p15)
#define JN_MAP_16(f ,p1 ,p2 ,p3 ,p4 ,p5 ,p6 ,p7 ,p8 ,p9 ,p10 ,p11 ,p12 ,p13 ,p14 ,p15 ,p16) f (p1) f (p2) f (p3) f (p4) f (p5) f (p6) f (p7) f (p8) f (p9) f (p10) f (p11) f (p12) f (p13) f (p14) f (p15) f (p16)
#define JN_MAP_17(f ,p1 ,p2 ,p3 ,p4 ,p5 ,p6 ,p7 ,p8 ,p9 ,p10 ,p11 ,p12 ,p13 ,p14 ,p15 ,p16 ,p17) f (p1) f (p2) f (p3) f (p4) f (p5) f (p6) f (p7) f (p8) f (p9) f (p10) f (p11) f (p12) f (p13) f (p14) f (p15) f (p16) f (p17)
#define JN_MAP_18(f ,p1 ,p2 ,p3 ,p4 ,p5 ,p6 ,p7 ,p8 ,p9 ,p10 ,p11 ,p12 ,p13 ,p14 ,p15 ,p16 ,p17 ,p18) f (p1) f (p2) f (p3) f (p4) f (p5) f (p6) f (p7) f (p8) f (p9) f (p10) f (p11) f (p12) f (p13) f (p14) f (p15) f (p16) f (p17) f (p18)
#define JN_MAP_19(f ,p1 ,p2 ,p3 ,p4 ,p5 ,p6 ,p7 ,p8 ,p9 ,p10 ,p11 ,p12 ,p13 ,p14 ,p15 ,p16 ,p17 ,p18 ,p19) f (p1) f (p2) f (p3) f (p4) f (p5) f (p6) f (p7) f (p8) f (p9) f (p10) f (p11) f (p12) f (p13) f (p14) f (p15) f (p16) f (p17) f (p18) f (p19)
#define JN_MAP_20(f ,p1 ,p2 ,p3 ,p4 ,p5 ,p6 ,p7 ,p8 ,p9 ,p10 ,p11 ,p12 ,p13 ,p14 ,p15 ,p16 ,p17 ,p18 ,p19 ,p20) f (p1) f (p2) f (p3) f (p4) f (p5) f (p6) f (p7) f (p8) f (p9) f (p10) f (p11) f (p12) f (p13) f (p14) f (p15) f (p16) f (p17) f (p18) f (p19) f (p20)
#define JN_MAP_21(f ,p1 ,p2 ,p3 ,p4 ,p5 ,p6 ,p7 ,p8 ,p9 ,p10 ,p11 ,p12 ,p13 ,p14 ,p15 ,p16 ,p17 ,p18 ,p19 ,p20 ,p21) f (p1) f (p2) f (p3) f (p4) f (p5) f (p6) f (p7) f (p8) f (p9) f (p10) f (p11) f (p12) f (p13) f (p14) f (p15) f (p16) f (p17) f (p18) f (p19) f (p20) f (p21)
#define JN_MAP_22(f ,p1 ,p2 ,p3 ,p4 ,p5 ,p6 ,p7 ,p8 ,p9 ,p10 ,p11 ,p12 ,p13 ,p14 ,p15 ,p16 ,p17 ,p18 ,p19 ,p20 ,p21 ,p22) f (p1) f (p2) f (p3) f (p4) f (p5) f (p6) f (p7) f (p8) f (p9) f (p10) f (p11) f (p12) f (p13) f (p14) f (p15) f (p16) f (p17) f (p18) f (p19) f (p20) f (p21) f (p22)
#define JN_MAP_23(f ,p1 ,p2 ,p3 ,p4 ,p5 ,p6 ,p7 ,p8 ,p9 ,p10 ,p11 ,p12 ,p13 ,p14 ,p15 ,p16 ,p17 ,p18 ,p19 ,p20 ,p21 ,p22 ,p23) f (p1) f (p2) f (p3) f (p4) f (p5) f (p6) f (p7) f (p8) f (p9) f (p10) f (p11) f (p12) f (p13) f (p14) f (p15) f (p16) f (p17) f (p18) f (p19) f (p20) f (p21) f (p22) f (p23)
#define JN_MAP_24(f ,p1 ,p2 ,p3 ,p4 ,p5 ,p6 ,p7 ,p8 ,p9 ,p10 ,p11 ,p12 ,p13 ,p14 ,p15 ,p16 ,p17 ,p18 ,p19 ,p20 ,p21 ,p22 ,p23 ,p24) f (p1) f (p2) f (p3) f (p4) f (p5) f (p6) f (p7) f (p8) f (p9) f (p10) f (p11) f (p12) f (p13) f (p14) f (p15) f (p16) f (p17) f (p18) f (p19) f (p20) f (p21) f (p22) f (p23) f (p24)
#define JN_MAP_25(f ,p1 ,p2 ,p3 ,p4 ,p5 ,p6 ,p7 ,p8 ,p9 ,p10 ,p11 ,p12 ,p13 ,p14 ,p15 ,p16 ,p17 ,p18 ,p19 ,p20 ,p21 ,p22 ,p23 ,p24 ,p25) f (p1) f (p2) f (p3) f (p4) f (p5) f (p6) f (p7) f (p8) f (p9) f (p10) f (p11) f (p12) f (p13) f (p14) f (p15) f (p16) f (p17) f (p18) f (p19) f (p20) f (p21) f (p22) f (p23) f (p24) f (p25)
#define JN_MAP_26(f ,p1 ,p2 ,p3 ,p4 ,p5 ,p6 ,p7 ,p8 ,p9 ,p10 ,p11 ,p12 ,p13 ,p14 ,p15 ,p16 ,p17 ,p18 ,p19 ,p20 ,p21 ,p22 ,p23 ,p24 ,p25 ,p26) f (p1) f (p2) f (p3) f (p4) f (p5) f (p6) f (p7) f (p8) f (p9) f (p10) f (p11) f (p12) f (p13) f (p14) f (p15) f (p16) f (p17) f (p18) f (p19) f (p20) f (p21) f (p22) f (p23) f (p24) f (p25) f (p26)
#define JN_MAP_27(f ,p1 ,p2 ,p3 ,p4 ,p5 ,p6 ,p7 ,p8 ,p9 ,p10 ,p11 ,p12 ,p13 ,p14 ,p15 ,p16 ,p17 ,p18 ,p19 ,p20 ,p21 ,p22 ,p23 ,p24 ,p25 ,p26 ,p27) f (p1) f (p2) f (p3) f (p4) f (p5) f (p6) f (p7) f (p8) f (p9) f (p10) f (p11) f (p12) f (p13) f (p14) f (p15) f (p16) f (p17) f (p18) f (p19) f (p20) f (p21) f (p22) f (p23) f (p24) f (p25) f (p26) f (p27)
#define JN_MAP_28(f ,p1 ,p2 ,p3 ,p4 ,p5 ,p6 ,p7 ,p8 ,p9 ,p10 ,p11 ,p12 ,p13 ,p14 ,p15 ,p16 ,p17 ,p18 ,p19 ,p20 ,p21 ,p22 ,p23 ,p24 ,p25 ,p26 ,p27 ,p28) f (p1) f (p2) f (p3) f (p4) f (p5) f (p6) f (p7) f (p8) f (p9) f (p10) f (p11) f (p12) f (p13) f (p14) f (p15) f (p16) f (p17) f (p18) f (p19) f (p20) f (p21) f (p22) f (p23) f (p24) f (p25) f (p26) f (p27) f (p28)
#define JN_MAP_29(f ,p1 ,p2 ,p3 ,p4 ,p5 ,p6 ,p7 ,p8 ,p9 ,p10 ,p11 ,p12 ,p13 ,p14 ,p15 ,p16 ,p17 ,p18 ,p19 ,p20 ,p21 ,p22 ,p23 ,p24 ,p25 ,p26 ,p27 ,p28 ,p29) f (p1) f (p2) f (p3) f (p4) f (p5) f (p6) f (p7) f (p8) f (p9) f (p10) f (p11) f (p12) f (p13) f (p14) f (p15) f (p16) f (p17) f (p18) f (p19) f (p20) f (p21) f (p22) f (p23) f (p24) f (p25) f (p26) f (p27) f (p28) f (p29)
#define JN_MAP_30(f ,p1 ,p2 ,p3 ,p4 ,p5 ,p6 ,p7 ,p8 ,p9 ,p10 ,p11 ,p12 ,p13 ,p14 ,p15 ,p16 ,p17 ,p18 ,p19 ,p20 ,p21 ,p22 ,p23 ,p24 ,p25 ,p26 ,p27 ,p28 ,p29 ,p30) f (p1) f (p2) f (p3) f (p4) f (p5) f (p6) f (p7) f (p8) f (p9) f (p10) f (p11) f (p12) f (p13) f (p14) f (p15) f (p16) f (p17) f (p18) f (p19) f (p20) f (p21) f (p22) f (p23) f (p24) f (p25) f (p26) f (p27) f (p28) f (p29) f (p30)
